From 1dbf134946392e671f478cecf04d31e1c5aaa4db Mon Sep 17 00:00:00 2001 From: Colin Walters Date: Sat, 19 Nov 2011 14:02:21 -0500 Subject: [PATCH] core: Rework argument parsing Default to /sysroot/ostree/repo when run as root. Also better handle the requires-repo flag. --- src/ostree/main.c | 96 ++++++++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 51 deletions(-) diff --git a/src/ostree/main.c b/src/ostree/main.c index 83b85a2f..16a661ee 100644 --- a/src/ostree/main.c +++ b/src/ostree/main.c @@ -93,11 +93,10 @@ prep_builtin_argv (const char *builtin, } static void -set_unknown_command (char **argv, GError **error) +set_error_print_usage (GError **error, const char *msg, char **argv) { + g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, msg); usage (argv, TRUE); - g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, - "Unknown command"); } int @@ -108,65 +107,60 @@ main (int argc, GError *error = NULL; int cmd_argc; char **cmd_argv = NULL; + gboolean am_root; + gboolean have_repo_arg; + const char *cmd = NULL; + const char *repo = NULL; g_type_init (); g_set_prgname (argv[0]); - builtin = builtins; - if (argc < 2) return usage (argv, 1); - - if (!g_str_has_prefix (argv[1], "--repo=")) + + am_root = getuid () == 0; + have_repo_arg = g_str_has_prefix (argv[1], "--repo="); + + if (!have_repo_arg && am_root) + repo = "/sysroot/ostree/repo"; + else if (have_repo_arg) + repo = argv[1] + strlen ("--repo="); + else + repo = NULL; + + if (!have_repo_arg) + cmd = argv[1]; + else + cmd = argv[2]; + + builtin = builtins; + while (builtin->name) { - const char *cmd = argv[1]; - gboolean found = FALSE; - - prep_builtin_argv (cmd, argc-2, argv+2, &cmd_argc, &cmd_argv); - while (builtin->name) - { - if (builtin->flags & OSTREE_BUILTIN_FLAG_NO_REPO - && strcmp (cmd, builtin->name) == 0) - { - found = TRUE; - if (!builtin->fn (cmd_argc, cmd_argv, NULL, &error)) - goto out; - break; - } - builtin++; - } - - if (!found) - set_unknown_command (argv, &error); + if (strcmp (cmd, builtin->name) == 0) + break; + builtin++; } - else + + if (!builtin) + { + set_error_print_usage (&error, "Unknown command", argv); + goto out; + } + + if (repo == NULL && !(builtin->flags & OSTREE_BUILTIN_FLAG_NO_REPO)) { - const char *repo = argv[1] + strlen ("--repo="); - const char *cmd = argv[2]; - gboolean found = FALSE; - - if (argc < 3) - return usage (argv, 1); - - prep_builtin_argv (cmd, argc-3, argv+3, &cmd_argc, &cmd_argv); - - while (builtin->name) - { - if (!(builtin->flags & OSTREE_BUILTIN_FLAG_NO_REPO) - && strcmp (cmd, builtin->name) == 0) - { - found = TRUE; - if (!builtin->fn (cmd_argc, cmd_argv, repo, &error)) - goto out; - break; - } - builtin++; - } - - if (!found) - set_unknown_command (argv, &error); + set_error_print_usage (&error, "Command requires a --repo argument", argv); + goto out; } + + if (!have_repo_arg) + prep_builtin_argv (cmd, argc-2, argv+2, &cmd_argc, &cmd_argv); + else + prep_builtin_argv (cmd, argc-3, argv+3, &cmd_argc, &cmd_argv); + + if (!builtin->fn (cmd_argc, cmd_argv, repo, &error)) + goto out; out: g_free (cmd_argv); -- 2.30.2